#include "exti.h"

void EXTI_NVIC_Config(void); // 声明EXTI_NVIC_Config函数

void EXTI_KEY0_Init(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;

	// 配置中断优先级
	EXTI_NVIC_Config();

	// 初始化GPIO
	KEY0_Init();

	// 初始化EXTI
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能复用功能时钟
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
	EXTI_InitStructure.EXTI_Line = EXTI_Line4;				// 中短线4
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;		// 中断模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;				// 使能外部中断线
	EXTI_Init(&EXTI_InitStructure);							// 根据EXTI_InitStructure中指定的参数初始化外设EXTI寄存器
}

static void EXTI_NVIC_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置NVIC中断分组2:2位抢占优先级，2位响应优先级

	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;		  // 使能按键KEY0所在的外部中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 外部中断通道的抢占优先级2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;		  // 子优先级1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			  // 使能外部中断通道
	NVIC_Init(&NVIC_InitStructure);							  // 根据NVIC_InitStructure中指定的参数初始化外设NVIC寄存器
}

// 外部中断3服务程序
void EXTI4_IRQHandler(void)
{
	if (EXTI_GetFlagStatus(EXTI_Line4) != RESET)
	{
		LED1 = !LED1;
	}

	EXTI_ClearITPendingBit(EXTI_Line4); // 清除中断标志位
}
